# coding:utf-8

'''

1. try 通用用法

try:
    # try检查并保护的业务代码，存在引发错误异常可能性的代码
    <code1>
except <异常类型>:
    # code1出现错误后执行的代码块
    <code2>


2. 捕获通用类异常

try:
    # try检查并保护的业务代码，存在引发错误异常可能性的代码
    <code1>
except Exception as e:
    # code1出现错误后执行的代码块
    <code2>

3. 捕获具体异常

try:
    # try检查并保护的业务代码，存在引发错误异常可能性的代码
    <code1>
except <具体异常类型> as e:
    # code1出现错误后执行的代码块
    <code2>

具体异常类型
① Exception 通常异常类型(基类)
② ZeroDivisionError 不能整除0
③ IOError 输入输出操作失败
④ AttributeError 对象无该属性
⑤ IndexError 没有当前的索引
⑥ KeyError 没有这个键值
⑦ NameError 没有这个变量，未初始化对象
⑧ SyntaxError 语法错误
⑨ SystemError 系统错误
⑩ ValueError 传入的参数错误

4. 捕获多个异常

# 方式一
# 当存在多个except代码块，当捕获到第一个后，不会继续往下捕获
try:
    ...
except ZeroDivisionError as e:
    ...
except Exception as e:
    ...

# 方式二
# 当except后边的异常类型使用元组包裹起来，捕获到哪种抛哪种
try:
    ...
except (ZeroDivisionError,Exception) as e:
    ...

5. finally

功能：
- 无论是否发生异常，一定会执行的代码块(如果try代码发生异常，则后续逻辑不会执行，程序控制流程会流向finally)
- 在函数中，即便在try或except中进行了return也依然会执行finally语法块
- try语法至少伴随except或finally中的一个

try:
    # try检查并保护的业务代码，存在引发错误异常可能性的代码
    <code1>
except <异常类型>:
    # code1出现错误后执行的代码块
    <code2>
finally:

    <code3>

6. raise

raise 异常类型(message)

用于主动报错，并被try捕获

7. 自定义异常类

继承基类exception
构造函数中定义错误信息

class NewError(Exception):
    def __init__(self,message):
       self.message = message
def test():
    raise NewError('this is a bug')

try:
    test()
except NewError as e:
    print(e)

8. assert断言

判断一个表达式，在其为false时候触发异常

assert expression,message

'''

def test():
    try:
        1/0
    except:
        print("error")

# test()
